Common Jackson Errors এবং তাদের সমাধান

Exception Handling in Jackson - জ্যাকসন অ্যানোটেশন (Jackson Annotations) - Java Technologies

247

Jackson লাইব্রেরি ব্যবহার করার সময় কিছু সাধারণ সমস্যা দেখা দিতে পারে, বিশেষ করে JSON Serialization এবং Deserialization এর প্রক্রিয়া চলাকালে। এই সমস্যা গুলো সাধারণত mapping issues, missing fields, invalid data types, বা circular references ইত্যাদি থেকে তৈরি হয়।

এখানে কিছু সাধারণ Jackson ত্রুটি এবং তাদের সমাধান দেওয়া হলো:


1. UnrecognizedPropertyException - Unknown Properties

সমস্যা:

যখন Jackson একটি JSON অবজেক্ট থেকে একটি Java Object-এ ডেটা ডেসিরিয়ালাইজ করার সময়, কিন্তু JSON অবজেক্টে এমন একটি ফিল্ড থাকে যেটি Java ক্লাসে নির্ধারিত নেই, তখন UnrecognizedPropertyException ত্রুটি হয়।

ত্রুটির উদাহরণ:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "age" (class User), not marked as ignorable

সমাধান:

  1. @JsonIgnoreProperties ব্যবহার করে অজানা প্রোপার্টি উপেক্ষা করুন।
    • এটি ignoreUnknown অপশন দিয়ে আপনি JSON থেকে অজানা প্রোপার্টি সঠিকভাবে বাদ দিতে পারেন।
  2. @JsonProperty ব্যবহার করে JSON ফিল্ডের নাম সঠিকভাবে মেপিং করুন।

কোড উদাহরণ:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private String name;
    private int age;

    // Getters and Setters
}

JSON Example:

{
  "name": "John",
  "age": 30,
  "gender": "male"  // This field will be ignored
}

2. InvalidFormatException - Invalid Data Format

সমস্যা:

এটি তখন ঘটে যখন JSON ডেটার ফরম্যাট এবং Java ক্লাসের ডেটা টাইপ মিলে না। উদাহরণস্বরূপ, আপনি একটি String থেকে int এ ডেসিরিয়ালাইজ করার চেষ্টা করলে এই ত্রুটি হতে পারে।

ত্রুটির উদাহরণ:

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `int` from String "abc": not a valid integer value

সমাধান:

  1. JSON ফরম্যাট ঠিক করা: JSON ফিল্ডটি সঠিক ডেটা টাইপে রূপান্তর করুন।
  2. @JsonFormat বা @JsonDeserialize ব্যবহার করুন: আপনি কাস্টম ডেটা ফরম্যাট নির্ধারণ করতে পারেন।

কোড উদাহরণ:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class User {
    private String name;
    
    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date birthDate;

    // Getters and Setters
}

Custom Deserializer:

import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CustomDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = p.getText();
        try {
            return sdf.parse(date);
        } catch (Exception e) {
            throw new IOException("Invalid date format");
        }
    }
}

3. JsonMappingException - Incorrect Field Mapping

সমস্যা:

JsonMappingException তখন ঘটে যখন Jackson একটি JSON অবজেক্টকে Java ক্লাসে রূপান্তর করতে পারে না। সাধারণত এটি সঠিক field mapping বা getter/setter এর অভাবের কারণে হয়।

ত্রুটির উদাহরণ:

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class User]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)

সমাধান:

  1. Default Constructor নিশ্চিত করুন।
  2. Getter এবং Setter Method নিশ্চিত করুন।
  3. @JsonProperty বা @JsonCreator ব্যবহার করুন যদি আপনি কাস্টম কনস্ট্রাক্টর ব্যবহার করেন।

কোড উদাহরণ:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    private String name;
    private int age;

    @JsonCreator
    public User(@JsonProperty("name") String name, @JsonProperty("age") int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and Setters
}

4. NullPointerException - Null Field Handling

সমস্যা:

এটি তখন ঘটে যখন আপনি একটি null ফিল্ডকে অপর্যাপ্তভাবে ডেসিরিয়ালাইজ করার চেষ্টা করেন, অথবা null ডেটা সেটের জন্য কোন ডিফল্ট মানের ব্যবস্থা না থাকে।

ত্রুটির উদাহরণ:

java.lang.NullPointerException: Cannot invoke "java.lang.String.length()" because "name" is null

সমাধান:

  1. @JsonInclude ব্যবহার করে null ফিল্ডে default behavior নির্ধারণ করা।
  2. @JsonProperty ব্যবহার করে null ফিল্ডের জন্য ডিফল্ট মান সেট করুন।

কোড উদাহরণ:

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

JSON Example:

{
  "name": null
}

5. StackOverflowError - Circular References

সমস্যা:

যখন আপনি দুটি অবজেক্টকে একে অপরকে রেফার করেন (bi-directional references), তখন StackOverflowError হতে পারে যদি circular reference ঠিকভাবে ম্যানেজ না করা হয়।

ত্রুটির উদাহরণ:

java.lang.StackOverflowError: null

সমাধান:

  1. @JsonManagedReference এবং @JsonBackReference ব্যবহার করে circular references এড়ানো।
  2. @JsonIdentityInfo ব্যবহার করে object ID নির্ধারণ করা।

কোড উদাহরণ:

import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonBackReference;

public class Person {
    private String name;
    
    @JsonManagedReference
    private Address address;
    
    // Getters and Setters
}

public class Address {
    private String street;
    
    @JsonBackReference
    private Person person;
    
    // Getters and Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonReferenceExample {
    public static void main(String[] args) throws Exception {
        Person person = new Person();
        person.setName("John Doe");

        Address address = new Address();
        address.setStreet("1234 Elm St");

        person.setAddress(address);
        address.setPerson(person);

        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(person);
        System.out.println(json);
    }
}

Jackson-এ বিভিন্ন ত্রুটি সাধারণত data mismatches, invalid formats, missing fields এবং circular references থেকে হয়। উপরের সমাধানগুলো আপনাকে এই সমস্যা গুলি সমাধান করতে সহায়তা করবে। সাধারণভাবে:

  • @JsonProperty, @JsonIgnoreProperties, এবং @JsonInclude ব্যবহার করে আপনি আপনার JSON ফাইলের কাঠামো নিয়ন্ত্রণ করতে পারেন।
  • @JsonManagedReference এবং @JsonBackReference circular references ব্লক করতে সাহায্য করে।
  • Default constructors এবং getter/setter methods নিশ্চিত করার মাধ্যমে JSON mappings সঠিকভাবে কাজ করবে।
Content added || updated By
Promotion

Are you sure to start over?

Loading...